package dao;

import enumeracao.StatusProjeto;

import java.io.Serializable;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import modelo.Projeto;
import util.Util;

public class ProjetoDAO implements Serializable {

    private final EntityManager manager;
    private final DAO<Projeto, Long> dao;

    public ProjetoDAO(EntityManager manager) {
        this.manager = manager;
        dao = new DAO(manager, Projeto.class);
    }

    public List<Projeto> listar() {
        return dao.listar();
    }

    public Projeto consulta(Long id) {
        return dao.consultar(id);
    }

    public List<Projeto> pesquisar(Projeto projeto) {
        String sql = "select proj from Projeto proj ";
        Map<String, Object> parametros = new HashMap<String, Object>();

        if (!Util.isNull(projeto.getNome())) {
            sql = adicionarCondicao(sql, " upper(proj.nome) like upper(:pnome) ");
            parametros.put("pnome", "%" + projeto.getNome() + "%");
        }
        
        if (!Util.isNull(projeto.getDonoProjeto()))  {
        	sql = adicionarCondicao(sql, " proj.donoProjeto = :pdonoprojeto");
            parametros.put("pdonoprojeto", projeto.getDonoProjeto());
        }

        if (!Util.isNull(projeto.getCategoria())) {
            sql = adicionarCondicao(sql, " proj.categoria = :pcategoria ");
            parametros.put("pcategoria", projeto.getCategoria());
        }

        if (!Util.isNull(projeto.getStatus())) {
            sql = adicionarCondicao(sql, "proj.status = :pstatus ");
            parametros.put("pstatus", projeto.getStatus());
        }


        if (!Util.isNull(projeto.getDataCriacao())) {
            int ano = projeto.getDataCriacao().get(Calendar.YEAR);
            sql = adicionarCondicao(sql, "year(proj.dataCriacao) = :pano ");
            parametros.put("pano", ano);
        }

        Query consulta = manager.createQuery(sql);

        for (String parametro : parametros.keySet()) {

            consulta.setParameter(parametro, parametros.get(parametro));
        }

        return consulta.getResultList();
    }

    private String adicionarCondicao(String completa, String add) {

        if (completa.contains("where")) {

            return completa + " and " + add;

        }

        return completa + " where " + add;
    }
    
    
    public void inserir(Projeto projeto) {
        
        projeto.setStatus(StatusProjeto.ABERTO);
        this.dao.inserir(projeto);
    }
    
    public Projeto atualizar(Projeto projeto) {
    	return this.dao.atualizar(projeto);
    }
}
